/*
 *   Licensed to the Apache Software Foundation (ASF) under one or more
 *   contributor license agreements.  See the NOTICE file distributed with
 *   this work for additional information regarding copyright ownership.
 *   The ASF licenses this file to You under the Apache License, Version 2.0
 *   (the "License"); you may not use this file except in compliance with
 *   the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing, software
 *   distributed under the License is distributed on an "AS IS" BASIS,
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *   See the License for the specific language governing permissions and
 *   limitations under the License.
 *
 */

package gateway.plugins.divide;

import gateway.Constants;
import gateway.PluginChain;
import gateway.WebContext;
import gateway.plugins.Plugin;
import gateway.zk.ServiceRegisterAndDiscover;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * Divide Plugin.
 *
 * @author fortune-teller
 */
@Slf4j
public class DividePlugin implements Plugin {
    @Autowired
    private ServiceRegisterAndDiscover serviceRegisterAndDiscover;
    @Override
    public Mono<Void> execute(ServerWebExchange exchange, PluginChain chain) {
        //获取请求上下文
        final WebContext context = exchange.getAttribute(Constants.CONTEXT);
        //根据注册发现服务定位到具体的服务地址
        String address = serviceRegisterAndDiscover.discover(context, LoadBalanceEnum.RANDOM.getLoadBalance());
        //把服务地址添加到Spring的http请求上下文
        exchange.getAttributes().put(Constants.HTTP_URL, address);
        return chain.execute(exchange);
    }
    @Override
    public int getOrder() {
        return 2;
    }
}
